/* * Copyright: Almende B.V. (2014), Rotterdam, The Netherlands * License: The Apache Software License, Version 2.0 */ package com.almende.demo.conferenceCloud; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.Map; import org.joda.time.DateTime; import com.almende.eve.agent.Agent; import com.almende.eve.agent.AgentConfig; import com.almende.eve.transform.rpc.annotation.Access; import com.almende.eve.transform.rpc.annotation.AccessType; import com.almende.eve.transform.rpc.annotation.Name; import com.almende.eve.transport.http.DebugServlet; import com.almende.eve.transport.http.HttpTransportConfig; import com.almende.eve.transport.ws.WebsocketTransportConfig; import com.almende.util.callback.AsyncCallback; import com.almende.util.callback.SyncCallback; import com.almende.util.jackson.JOM; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; /** * The Class ConferenceCloudAgent. */ public class ConferenceCloudAgent extends Agent { private static final String BASEURL = "http://127.0.0.1:8082/agents/"; private static final String WSBASEURL = "ws://192.168.1.108:8082/ws/"; private static final String WSCLIENTURL = "wsclient:"; private DateTime lastUpdate = null; private Info myInfo = null; /** * Inits the Conference Cloud Agent. * * @param id * the id */ public void init(String id) { final AgentConfig config = new AgentConfig(id); final ArrayNode transports = JOM.createArrayNode(); final WebsocketTransportConfig serverConfig = new WebsocketTransportConfig(); serverConfig.setServer(true); serverConfig.setDoAuthentication(false); serverConfig.setAddress(WSBASEURL + id); serverConfig.setServletLauncher("JettyLauncher"); final ObjectNode jettyParms = JOM.createObjectNode(); jettyParms.put("port", 8082); serverConfig.set("jetty", jettyParms); transports.add(serverConfig); final HttpTransportConfig httpConfig = new HttpTransportConfig(); httpConfig.setServletUrl(BASEURL); httpConfig.setServletClass(DebugServlet.class.getName()); httpConfig.setDoAuthentication(false); httpConfig.setServletLauncher("JettyLauncher"); httpConfig.set("jetty", jettyParms); transports.add(httpConfig); config.setTransport(transports); setConfig(config); myInfo = new Info(getId()); } /** * Seen. * * @param id * the id * @param info * the info */ @Access(AccessType.PUBLIC) public void seen(final @Name("id") String id, final @Name("info") Info info) { // TODO: check if we know url, by contacting the agent and asking. final AsyncCallback<Info> callback = new AsyncCallback<Info>() { @Override public void onSuccess(Info result) { final ObjectNode params = JOM.createObjectNode(); params.put("id", id); params.set("info", JOM.getInstance().valueToTree(result)); try { caller.call(new URI(WSCLIENTURL + getId()), "know", params); } catch (IOException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } } @Override public void onFailure(Exception exception) { System.err.println("onFailure called:"); exception.printStackTrace(); } }; try { final ObjectNode params = JOM.createObjectNode(); params.set("mine", JOM.getInstance().valueToTree(getMyInfo())); params.set("yours", JOM.getInstance().valueToTree(info)); caller.call(new URI(BASEURL + id), "getInfo", params, callback); } catch (IOException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } } /** * Gets the info. * * @param remoteInfo * the remote info * @param newInfo * the new info * @return the info */ @Access(AccessType.PUBLIC) public Info getInfo(final @Name("mine") Info remoteInfo, final @Name("yours") Info newInfo) { final Info result = new Info(); result.merge(getMyInfo()); final Map<String,String> knownNames = result.getKnownNames(); if (knownNames.containsKey(remoteInfo.getName())){ result.setKnown(true); result.setWhy(knownNames.get(remoteInfo.getName())); } System.err.println("Got:"+remoteInfo.getName()+" and returning:"+JOM.getInstance().valueToTree(newInfo.merge(result))+" with:"+knownNames); return newInfo.merge(result); } /** * Gets the my info. * * @return the my info */ public Info getMyInfo() { if (myInfo != null && lastUpdate != null && lastUpdate.plus(300000).isAfterNow()){ return myInfo; } final ObjectNode params = JOM.createObjectNode(); final SyncCallback<Info> callback = new SyncCallback<Info>() { }; try { caller.call(new URI(WSCLIENTURL + getId()), "getMyInfo", params, callback); myInfo = myInfo.merge(callback.get()); lastUpdate = DateTime.now(); } catch (IOException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return myInfo; } /** * Sets the my info. * * @param myInfo * the new my info */ public void setMyInfo(final @Name("info") Info myInfo){ System.err.println("Updating myInfo:"+myInfo); this.myInfo = myInfo; this.lastUpdate = DateTime.now(); } }